package jvm.codeOptimization;

import javax.swing.plaf.synth.ColorType;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * @author msi
 * 一些泛型的问题，
 * 根据前面的学习我们知道了泛型的擦除和使用时的强制类型转化。
 */
public class GenericTest {
    public static void main(String[] args) {
        //原始类型的泛型，目前JDK8不支持
//        ArrayList<int> ints=new ArrayList<int>();
//        ArrayList<long> longs=new ArrayList<long>();
//        ArrayList list;
//        list=ints;
//        list=longs;
        /**
         * 在之前的类型种可以使用强制类型转化去完成，但是在这段代码种int,long是不能够转化成Object类型的。它就没办法转化，这时候java的解决办法是采用自动装箱拆箱，将原始类型，转化称为包装类型去解决。这会浪费大量的时间，
         * 实际上这个问题就是目前泛型慢的主要原因，也是今天Valhalla项目要重点解决的问题，
         * 第二是在运行期间无法获取泛型的类型信息，会将代码变得非常繁琐。如： convert()
         */
//        method(new ArrayList<String>());
//        method(new ArrayList<Integer>());
    }
    public static <T> T[] convert(List<T> list,Class<T> cType){
        T[] array= (T[]) Array.newInstance(cType,list.size());
        return array;
    }

    //当泛型遇见重载1
//    public static void method(List<String> list){
//        System.out.println("String");
//    }
//
//    public static void method(List<Integer> list){
//        System.out.println("Integer");
//    }
    /**
     * 不能编译也不能运行，在编译时擦除泛型后会得到两个一摸一样的方法。
     */

    //当泛型遇见重载2
//    public static void method(List<String> list){
//        System.out.println("String");
//    }
//
//    public static int method(List<Integer> list){
//        System.out.println("Integer");
//        return 1;
//    }
    /**
     * 在JDK6中可以编译和运行，但是在JDK8中不能被编译运行。
     * 书上解释是说这两个方法的返回值不同，所以它们的特征(Signature)不同。所以可以编译运行。
     * 并且在Signature属性中我们可以得到泛型的具体类型，所谓的泛型擦除仅仅擦除的是Code属性中的泛型类型。
     */
}
